package com.nowcoder.community.c_service;

import com.github.benmanes.caffeine.cache.CacheLoader;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;
import com.nowcoder.community.a_entity.DiscussPost;
import com.nowcoder.community.a_entity.User;
import com.nowcoder.community.b_dao.DiscussPostMapper;
import com.nowcoder.community.b_dao.DiscussPostMapper;
import com.nowcoder.community.z_util.MinGanF;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.util.HtmlUtils;

import javax.annotation.PostConstruct;
import java.awt.*;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Service
public class DiscussPostService {
    private static final Logger logger = LoggerFactory.getLogger(DiscussPostService.class);

    @Autowired
    private DiscussPostMapper discussPostMapper;
    /**
     * <p>————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
     * <p>      咖啡因的pom对象
     * <p>————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
     */
    private LoadingCache<String, List<DiscussPost>> postListCache; //不可以用auto，下面我自己注入

    @PostConstruct//类加载的时候先初始存一下【一劳永逸嘛！先慢工后面快起来了就】
    public void initCaffe(){
        postListCache = Caffeine.newBuilder()
                .maximumSize(15)//15条list
                .expireAfterWrite(180, TimeUnit.SECONDS)//3分钟清空
                /**
                 * <p>————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
                 * <p>      第一次init 和 下面没找到执行build
                 * <p>————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
                 */
                .build(new CacheLoader<String, List<DiscussPost>>() {
                    @Override
                    public List<DiscussPost> load(@NonNull String key) throws Exception {
                        String[] params = key.split(":");
                        int offset = Integer.valueOf(params[0]);
                        int limit = Integer.valueOf(params[1]);
                        logger.debug("caffe里没有，去数据库拿的首页帖子List");
                        //只缓存时间排序的默认帖子就足够了。。吧。。
                        return discussPostMapper.selectDiscussPosts(0,offset,limit,0);
                    }
                });
    }



    @Autowired
    private MinGanF minganF;

    //没业务，直接返数据库查的
    public List<DiscussPost> findDiscussPosts(int userId, int offset, int limit, int orderMode) {
        /**
         * <p>————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
         * <p>      加入核心caffe一级本地缓存封堵
         * <p>————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
         */
//        if(userId==0){//后面动态sql，0是查所有
//            logger.debug("咖啡1");
//            return postListCache.get(offset+":"+limit);//caffe也是kv
//        }

        /**
         * <p>————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
         * <p>      下面这句不会执行了，但是上面if 所以下面return个什么都行。。
         * <p>————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
         */
        return discussPostMapper.selectDiscussPosts(userId,offset,limit,orderMode);
    }

    public int findDiscussPostRows(int userid){
        return discussPostMapper.selectDiscussPostRows(userid);//userid=0时，默认查所有
    }
    //这个id不是userid，而是指定一个帖子的id
    public DiscussPost findPostById(int id){
        return discussPostMapper.selectDiscussPostById(id);
    }


    public void addDiscussPost(DiscussPost post){
        // 转义HTML标记
        post.setTitle(HtmlUtils.htmlEscape(post.getTitle()));
        post.setContent(HtmlUtils.htmlEscape(post.getContent()));

        //过滤敏感词!!
        MinGanF minganUtil = new MinGanF();
        post.setTitle(minganF.guolv(post.getTitle()));
        post.setContent(minganF.guolv(post.getContent()));//里面重新get，外面重新set
        discussPostMapper.insertDiscussPost(post);
    }

    public void updateCommentCount(int id , int commentCount){
        discussPostMapper.updataCommentCount(id, commentCount);
    }

    //置顶、加精
    public int updateType(int id, int type) {
        return discussPostMapper.updateType(id, type);
    }
    //删除
    public int updateStatus(int id, int status) {
        return discussPostMapper.updateStatus(id, status);
    }
    //评分
    public int updateScore(int id, double score) {
        return discussPostMapper.updateScore(id, score);
    }
}